package cn.b.sky.flowable.service;

import cn.b.sky.flowable.model.NodeDTO;
import cn.b.sky.flowable.model.WorkFlowHistory;
import cn.b.sky.flowable.model.condition.WaitTaskCondition;
import cn.b.sky.common.model.Page;
import org.flowable.engine.common.impl.interceptor.Command;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import java.util.List;
import java.util.Map;

/**
 * 
 * <strong>Title : WorkFlowFacade.java<br></strong>
 * <strong>Package : cn.b.sky.user.service<br></strong>
 * <strong>Description : </strong>流程相应接口<br> 
 * <strong>Create on : 2015-11-6 下午4:31:04<br></strong>
 * <p>
 * @author lidapeng<br>
 * @version <strong>v1.0.0</strong><br>
 * <br>
 * <strong>修改历史:</strong><br>
 * 修改人 | 修改日期 | 修改描述<br>
 * -------------------------------------------<br>
 * <br>
 * <br>
 */
public interface WorkFlowFacade {

  /**
   * 
   * <strong>Title : startProcess<br></strong>
   * <strong>Description : </strong>启动流程<br> 
   * <strong>Create on : 2015-11-6 下午4:31:59<br></strong>
   * <p>
   * @param map
   * @return
   * ProcessInstance
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  ProcessInstance startProcess(Map<String, Map<String, Object>> map);

  /**
   * 
   * <strong>Title : claimTask<br></strong>
   * <strong>Description : </strong>签收任务<br> 
   * <strong>Create on : 2015-11-9 上午9:58:58<br></strong>
   * <p>
   * @param taskId
   * @param userId
   * @param siteCode
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  void claimTask(String taskId, String userId, String siteCode);

  /**
   * 
   * <strong>Title : getTaskById<br></strong>
   * <strong>Description : </strong>获取任务<br> 
   * <strong>Create on : 2015-11-9 下午3:54:30<br></strong>
   * <p>
   * @param taskId
   * @return
   * Task
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  Task getTaskById(String taskId);

  /**
   * 
   * <strong>Title : getTaskFormKey<br></strong>
   * <strong>Description : </strong>获取流程节点的表单<br> 
   * <strong>Create on : 2015-11-9 下午3:56:36<br></strong>
   * <p>
   * @param deploymentId 发布的流程的id
   * @param taskDefinitionKey 节点code
   * @param tenantId 租户，工厂编号
   * @return
   * String
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  String getTaskFormKey(String deploymentId, String taskDefinitionKey, String tenantId);
  
  /**
   * 
   * <strong>Title : getStartNodeFormKey<br></strong>
   * <strong>Description : </strong>获取已发布流程的开始节点的表单<br> 
   * <strong>Create on : 2016-11-22 下午2:19:40<br></strong>
   * <p>
   * @param deploymentId
   * @param tenantId
   * @return
   * String
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  String getStartNodeFormKey(String deploymentId, String tenantId);

  /**
   * 
   * <strong>Title : completeTask<br></strong>
   * <strong>Description : </strong>完成任务<br> 
   * <strong>Create on : 2015-11-9 下午4:09:29<br></strong>
   * <p>
   * @param taskId
   * @param changeMap
   * @param changeMap2
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  void completeTask(String taskId, Map<String, Object> changeMap, Map<String, Object> changeMap2);

  /**
   * 
   * <strong>Title : getProcessInstanceById<br></strong>
   * <strong>Description : </strong>获取流程实例<br> 
   * <strong>Create on : 2015-11-9 下午4:23:35<br></strong>
   * <p>
   * @param processInstanceId
   * @return
   * ProcessInstance
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  ProcessInstance getProcessInstanceById(String processInstanceId);

  /**
   * 
   * <strong>Title : traceProcess<br></strong>
   * <strong>Description : </strong>输出流程图跟踪的信息<br> 
   * <strong>Create on : 2015-11-9 下午4:26:38<br></strong>
   * <p>
   * @param processInstanceId
   * @return
   * List<NodeDTO>
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  List<NodeDTO> traceProcess(String processInstanceId);

  /**
   * 
   * <strong>Title : endWorkFlow<br></strong>
   * <strong>Description : </strong>终止流程实例<br> 
   * <strong>Create on : 2015-11-10 下午4:47:40<br></strong>
   * <p>
   * @param processInstanceId
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  void endWorkFlow(String processInstanceId);

  /**
   * 
   * <strong>Title : transferAssignee<br></strong>
   * <strong>Description : </strong>移交任务<br> 
   * <strong>Create on : 2015-11-10 下午5:01:25<br></strong>
   * <p>
   * @param taskId
   * @param userCode
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  void transferAssignee(String taskId, String userCode);

  /**
   * 
   * <strong>Title : saveWorkFlowHistory<br></strong>
   * <strong>Description : </strong>保存流程历史记录<br> 
   * <strong>Create on : 2015-11-10 下午5:14:06<br></strong>
   * <p>
   * @param task
   * @param history
   * @param username
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  void saveWorkFlowHistory(Task task, WorkFlowHistory history, String username);

  /**
   * 
   * <strong>Title : executeCommand<br></strong>
   * <strong>Description : </strong>执行命令<br> 
   * <strong>Create on : 2015-11-11 下午6:04:20<br></strong>
   * <p>
   * @param command
   * @return
   * T
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  public <T> T executeCommand(Command<T> command);

  /**
   * 
   * <strong>Title : findTasks<br></strong>
   * <strong>Description : </strong>查询待办<br> 
   * <strong>Create on : 2015-11-24 上午11:08:15<br></strong>
   * <p>
   * @param currentUserName
   * @param siteCode
   * @param page
   * void
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  Page findTasks(String currentUserName, String siteCode, WaitTaskCondition page);

  /**
   * 
   * <strong>Title : findfinishedTasks<br></strong>
   * <strong>Description : </strong>已办<br> 
   * <strong>Create on : 2015-11-24 下午12:56:55<br></strong>
   * <p>
   * @param currentUserName
   * @param siteCode
   * @param page
   * @return
   * Page
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  Page findfinishedTasks(String currentUserName, String siteCode, WaitTaskCondition page);

  /**
   * 
   * <strong>Title : findRunningTasks<br></strong>
   * <strong>Description : </strong>获取运行中的流程实例<br> 
   * <strong>Create on : 2015-11-24 下午1:27:00<br></strong>
   * <p>
   * @param siteCode
   * @param page
   * @return
   * Page
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  Page findRunningTasks(String siteCode, WaitTaskCondition page);

  /**
   * 
   * <strong>Title : getWorkFlowHistoryByBusinessKeyAndTaskDefKey<br></strong>
   * <strong>Description : </strong>查询审批记录<br> 
   * <strong>Create on : 2015-11-25 上午10:18:17<br></strong>
   * <p>
   * @param bussinessKey
   * @param taskDefinitionKey
   * @return
   * List<WorkFlowHistory>
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  List<WorkFlowHistory> getWorkFlowHistoryByBusinessKeyAndTaskDefKey(String bussinessKey, String taskDefinitionKey,
                                                                     String tenantId);

  /**
   * 
   * <strong>Title : getWorkFlowHistoryByprocessInstanceId<br></strong>
   * <strong>Description : </strong>通过流程实例获取流程历史<br> 
   * <strong>Create on : 2015-12-2 下午2:49:04<br></strong>
   * <p>
   * @param processInstanceId
   * @param tenantId
   * @return
   * List<WorkFlowHistory>
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  List<WorkFlowHistory> getWorkFlowHistoryByprocessInstanceId(String processInstanceId, String tenantId);

  /**
   * 
   * <strong>Title : getHistoricTaskById<br></strong>
   * <strong>Description : </strong>查询历史任务<br> 
   * <strong>Create on : 2015-11-26 上午10:13:20<br></strong>
   * <p>
   * @param taskId
   * @return
   * HistoricTaskInstance
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  HistoricTaskInstance getHistoricTaskById(String taskId);

  /**
   * 
   * <strong>Title : getProcessInstanceStatus<br></strong>
   * <strong>Description : </strong>获取流程的状态（未发起，进行中，已结束，已终止）<br> 
   * <strong>Create on : 2015-11-30 下午5:41:55<br></strong>
   * <p>
   * @param businessKey 业务key
   * @param tenantId 租户id
   * @return
   * String
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  public String getProcessInstanceStatus(String businessKey, String tenantId);

  /**
   * 
   * <strong>Title : getHistoricProcessInstanceByBusinessKeyAndTenantId<br></strong>
   * <strong>Description : </strong>业务数据查看流程图<br> 
   * <strong>Create on : 2015-12-2 下午3:38:25<br></strong>
   * <p>
   * @param businessKey
   * @param siteCode
   * @return
   * HistoricProcessInstance
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  HistoricProcessInstance getHistoricProcessInstanceByBusinessKeyAndTenantId(String businessKey, String siteCode);

  /**
   * 
   * <strong>Title : getProcessDefinitionByProcessDefinitionKey<br></strong>
   * <strong>Description : </strong>获取已发布流程的流程定义<br> 
   * <strong>Create on : 2016-11-22 下午5:06:22<br></strong>
   * <p>
   * @param processdefinitionId
   * @param siteCode
   * @return
   * ProcessDefinition
   * @throws 
   * @author lidapeng<br>
   * @version <strong>v1.0.0</strong><br>
   * <br>
   * <strong>修改历史:</strong><br>
   * 修改人 | 修改日期 | 修改描述<br>
   * -------------------------------------------<br>
   * <br>
   * <br>
   */
  ProcessDefinition getProcessDefinitionByProcessDefinitionKey(String processdefinitionId, String siteCode);

}
